package com.example.util;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.example.entity.ImageEntity;
import com.thoughtworks.xstream.XStream;

public  class WxMessageUtil {
	/**
	 * 请求消息类型：关注
	 */
	public final static String SUBSCRIBE = "subscribe";
	/**
	 * 请求消息类型：文本
	 */
	public final static String REQ_MESSAGE_TYPE_TEXT = "text";
 
	/**
	 * 请求消息类型：图片
	 */
	public final String REQ_MESSAGE_TYPE_IMAGE="image";
 
	/**
	 * 请求消息类型：语音
	 */
	public final String REQ_MESSAGE_TYPE_VOICE="voice";
	
	/**
	 * 请求消息类型：视频
	 */
	public final String REQ_MESSAGE_TYPE_VIDEO="video";
	
	/**
	 * 请求消息类型：链接
	 */
	public final String REQ_MESSAGE_TYPE_LINK = "link";
	
	/**
	 * 请求消息类型：地理位置
	 */
	public  final String REQ_MESSAGE_TYPE_LOCATION="location";
	
	/**
	 * 请求消息类型：小视频
	 */
	public final String REQ_MESSAGE_TYPE_SHORTVIDEO="shortvideo";
	
	/**
	 *请求消息类型：事件推送 
	 */
	public final String REQ_MESSAGE_TYPE_EVENT = "event";
	
	/**
	 * 返回消息类型：文本
	 */
	public final String RESP_MESSAGE_TYPE_TEXT = "text";
	
	/**
	 * 消息返回类型：图片
	 */
	public final String RESP_MESSAGE_TYPE_IMAGE="image";
	
	/**
	 * 消息返回类型:语音
	 */
	public final String RESP_MESSAGE_TYPE_VOICE = "voice";
	
	/**
	 * 消息返回类型：音乐
	 */
	public final String RESP_MESSAGE_TYPE_MUSIC = "music";
	
	/**
	 * 消息返回类型：图文
	 */
	public final  String RESP_MESSAGE_TYPE_NEWS = "news";
	
	/**
	 * 消息返回类型：视频
	 */
	public final String RESP_MESSAGE_TYPE_VIDEO="video";
	
	/**
	 * 事件类型:订阅
	 */
	public final String EVENT_TYPE_SUBSCRIBE = "subscribe";
	
	/**
	 * 事件类型：取消订阅
	 */
	public final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
	
	/**
	 * 事件类型：scan(关注用户扫描带参二维码)
     */
	public final String EVENT_TYPE_SCAN = "scan";
 
	/**
	 * 事件类型：location(上报地理位置)
	 */
	public final String EVENT_TYPE_LOCATION = "location";
	
	/**
	 * 事件类型：CLICK(点击菜单拉取消息)
	 */
	public final String EVENT_TYPE_CLICK ="CLICK";
	
	/**
	 * 事件类型：VIEW(自定义菜单URl视图)
	 */
	public final String EVENT_TYPE_VIEW ="VIEW";
	
	/**
	 * 事件类型：TEMPLATESENDJOBFINISH(模板消息送达情况提醒)
	 */
	public final String EVENT_TYPE_TEMPLATESENDJOBFINISH="TEMPLATESENDJOBFINISH";
	
	
	/**
	  * @Description: 解析微信服务器发过来的xml格式的消息将其转换为map
	  * @Parameters: WeixinMessageUtil
	  * @Return: Map<String, String>
	  * @Create Date: 2017年10月11日上午11:41:23
	  * @Version: V1.00 
	  * @author:来日可期
	  */
	public static Map<String, String> parseXml(HttpServletRequest request)throws Exception{
		
		// 将解析结果存储在HashMap中
		Map<String, String>map =new HashMap<String, String>();
		// 从request中得到输入流
		InputStream  inputStream=request.getInputStream();
		// 读取输入流
		SAXReader reader = new SAXReader();
		Document document = reader.read(inputStream);
		// 得到XML的根元素
		Element root = document.getRootElement();
		// 得到根元素的所有子节点
		@SuppressWarnings("unchecked")
		List<Element> elementList = root.elements();
		// 判断又没有子元素列表
		if (elementList.size()==0){
			map.put(root.getName(), root.getText());
		}else {
			for (Element e : elementList)
				map.put(e.getName(), e.getText());
		}
		// 释放资源
		inputStream.close();
		inputStream = null;
		return map;
	}
	
	
	/**
	 * 对象转xml
	 * @param b
	 * @return
	 */
	public static String getDocument(Object b) {
		Document document = DocumentHelper.createDocument();
		try {
		// 创建根节点元素
		Element root = document.addElement(b.getClass().getSimpleName());
		Field[] field = b.getClass().getDeclaredFields(); // 获取实体类b的所有属性，返回Field数组
		for (int j = 0; j < field.length; j++) { // 遍历所有有属性
		String name = field[j].getName(); // 获取属属性的名字
		if (!name.equals("serialVersionUID")) {//去除串行化序列属性
		name = name.substring(0, 1).toUpperCase()
		+ name.substring(1); // 将属性的首字符大写，方便构造get，set方法
		Method m = b.getClass().getMethod("get" + name);
		// System.out.println("属性get方法返回值类型:" + m.getReturnType());
		String propertievalue = (String) m.invoke(b);// 获取属性值
		Element propertie = root.addElement(name);
		propertie.setText(propertievalue);
		}
		}


		} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();


		}

		return document.asXML();
		}


	/**
	 * 将对象转为xml
	 */
	public static String objectToXml(Object obj) {
		XStream xst = new XStream();
		xst.processAnnotations(obj.getClass()); 
		return xst.toXML(obj);
	}
	
}
